using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;

namespace XnaDevRu.BulletX.Dynamics
{
	public abstract class DynamicsWorld : CollisionWorld
	{
		public DynamicsWorld(IDispatcher dispatcher, OverlappingPairCache pairCache)
			: base(dispatcher, pairCache) { }

		//once a rigidbody is added to the dynamics world, it will get this gravity assigned
		//existing rigidbodies in the world get gravity assigned too, during this method
		public abstract Vector3 Gravity { set; }
		public abstract IConstraintSolver ConstraintSolver { set; }
		public virtual int ConstraintsCount { get { return 0; } }
		public abstract IDebugDraw DebugDrawer { get; set; }

		//stepSimulation proceeds the simulation over timeStep units
		public abstract void StepSimulation(float timeStep, int numSubsteps, float fixedTimeStep);

		public void StepSimulation(float timeStep)
		{
			StepSimulation(timeStep, 1, 1f / 60f);
		}

		public abstract void UpdateAabbs();

		public virtual void AddConstraint(TypedConstraint constraint) { }
		public virtual void RemoveConstraint(TypedConstraint constraint) { }

		public abstract void AddRigidBody(RigidBody body);
		public abstract void RemoveRigidBody(RigidBody body);

		public virtual TypedConstraint GetConstraint(int index) { return null; }
	}
}
